home *** CD-ROM | disk | FTP | other *** search
- #include "GXEdit.h"
- #include "GXEditDoc.h"
- #include "GXEditReplace.h"
- #include "GXEditNewRun.h"
- #include "GXEditDebug.h"
- #include "GXEditStyle.h"
-
- static void InitCounters(ReplacementPtr replacements);
- static void IncrementCounters(ReplacementPtr replacements);
- static void FindAndAdd(ReplacementPtr replacements);
- static void AddReplace(ReplacementPtr replacements, ReplacePtr replace);
- static Boolean FindReplace(ReplacementPtr replacements, short replaceIndex, ReplacePtr replace);
- static Boolean FindStrInRun(ReplacementPtr replacements, Str255 str, NewRunPtr rp, short *runOffset);
- static void DoReplace(ReplacementPtr replacements, ReplacePtr replace);
-
- void NewReplacements(DocPtr dp, GXEditProofPtr proof, ReplacementPtr replacements)
- {
- replacements->dp = dp;
- replacements->proof = proof;
- replacements->numReplacements = 0;
- replacements->replaceList = (ReplaceHan) NewHandle(0);
-
- FindAndAdd(replacements);
-
- InitCounters(replacements);
- }
-
- void DoReplacements(ReplacementPtr replacements)
- {
- short i;
- ReplacePtr rp;
-
- rp = *replacements->replaceList;
-
- for(i=0; i<replacements->numReplacements; i++, rp++)
- DoReplace(replacements, rp);
-
- IncrementCounters(replacements);
-
- }
-
- Boolean TestReplacements(ReplacementPtr replacements)
- {
- if(replacements->done) {
- replacements->done = false;
- return(true);
- } else
- return(false);
-
- }
-
- void DisposeReplacements(ReplacementPtr replacements)
- {
- DisposeHandle((Handle) replacements->replaceList);
- }
-
- static void InitCounters(ReplacementPtr replacements)
- {
- short i;
-
- for(i=0; i<kGXEditNumReplace && replacements->proof->replace[i]; i++)
- replacements->curChar[i] = replacements->proof->fromChar[i];
-
- replacements->done = false;
- }
-
- static void IncrementCounters(ReplacementPtr replacements)
- {
- short i;
-
- for(i=0; i<kGXEditNumReplace && replacements->proof->replace[i]; i++)
- if(replacements->curChar[i] < replacements->proof->toChar[i]) {
- replacements->curChar[i]++;
- return;
- } else
- replacements->curChar[i] = replacements->proof->fromChar[i];
-
- replacements->done = true;
-
- }
-
- static void FindAndAdd(ReplacementPtr replacements)
- {
- short i,j;
- ReplaceRec replace;
-
- for(i=0; i<kGXEditNumReplace && replacements->proof->replace[i]; i++)
- while(FindReplace(replacements, i, &replace)) {
-
- AddReplace(replacements, &replace);
-
- /* now adjust any replacements whose run offsets was affected when
- the replacement was made */
-
- for(j=0; j<(replacements->numReplacements - 1); j++)
- if((*replacements->replaceList)[j].runIndex == replace.runIndex &&
- (*replacements->replaceList)[j].runOffset > replace.runOffset)
- (*replacements->replaceList)[j].runOffset -= replacements->proof->replaceStr[i][0] - 1;
-
- }
-
- }
-
- static void AddReplace(ReplacementPtr replacements, ReplacePtr replace)
- {
- replacements->numReplacements++;
- PtrAndHand((Ptr) replace, (Handle) replacements->replaceList, sizeof(ReplaceRec));
- }
-
- static Boolean FindReplace(ReplacementPtr replacements, short replaceIndex, ReplacePtr replace)
- {
- ScrapPtr scrap;
- NewRunPtr rp;
- short charsToRemove;
- short runIndex;
- short runOffset;
- short styleIndex;
- DocPtr dp;
- Size size;
-
- dp = replacements->dp;
-
- scrap = &replacements->dp->scrap;
-
- HLock((Handle) scrap->runs);
-
- rp = *scrap->runs;
-
- for(runIndex = 0; runIndex < scrap->numRuns; runIndex++, rp++)
- if(FindStrInRun(replacements, replacements->proof->replaceStr[replaceIndex], rp, &runOffset)) {
-
- if(!replacements->proof->glyphIndicies) {
-
- /* remove all but one character of replacement string */
-
- charsToRemove = replacements->proof->replaceStr[replaceIndex][0] - 1;
-
- if(charsToRemove > 0) {
- NewRunClear(dp, rp, runOffset + 1, charsToRemove);
- scrap->numText -= charsToRemove;
- }
-
- } else {
-
- /* hmm, lets see. Since we were able to find the string, the run must not have
- the platform of gxGlyphPlatform. So, we will need to delete the replace string
- and insert a new run with a single dummy glyph index and an appropriate encoding */
-
- styleIndex = SetDocStyleEncoding(replacements->dp, rp->styleIndex, gxGlyphPlatform, gxNoScript, gxNoLanguage);
-
- /* lets first delete the replace string */
-
- charsToRemove = replacements->proof->replaceStr[replaceIndex][0];
- NewRunClear(dp, rp, runOffset, charsToRemove);
-
- scrap->numText -= charsToRemove;
-
- /* now, insert the dummy glyph index
- NOTE: if you get a feeling of DejaVu, look at GXEditParagraph text insertion */
-
- if(runOffset == 0) {
-
- scrap->numRuns++;
-
- HUnlock((Handle) scrap->runs);
-
- size = scrap->numRuns * sizeof(NewRunRec);
- SetHandleSize((Handle) scrap->runs, size);
-
- HLock((Handle) scrap->runs);
-
- size = (scrap->numRuns - runIndex - 1) * sizeof(NewRunRec);
- BlockMove((Ptr) (*scrap->runs + runIndex), (Ptr) (*scrap->runs + runIndex + 1), size);
-
- NewNewRun(dp, *scrap->runs + runIndex, styleIndex);
-
- runOffset = 0;
-
- } else if(runOffset == rp->numText) {
-
- runIndex++;
-
- scrap->numRuns++;
-
- HUnlock((Handle) scrap->runs);
-
- size = scrap->numRuns * sizeof(NewRunRec);
- SetHandleSize((Handle) scrap->runs, size);
-
- HLock((Handle) scrap->runs);
-
- size = (scrap->numRuns - runIndex - 1) * sizeof(NewRunRec);
- BlockMove((Ptr) (*scrap->runs + runIndex), (Ptr) (*scrap->runs + runIndex + 1), size);
-
- NewNewRun(dp, *scrap->runs + runIndex, styleIndex);
-
- runOffset = 0;
-
- } else {
-
- scrap->numRuns += 2;
-
- HUnlock((Handle) scrap->runs);
-
- size = scrap->numRuns * sizeof(NewRunRec);
- SetHandleSize((Handle) scrap->runs, size);
-
- HLock((Handle) scrap->runs);
-
- size = (scrap->numRuns - runIndex - 3) * sizeof(NewRunRec);
- BlockMove((Ptr) (*scrap->runs + runIndex + 1), (Ptr) (*scrap->runs + runIndex + 3), size);
-
- SplitNewRun(dp, *scrap->runs + runIndex, runOffset, *scrap->runs + runIndex + 2);
-
- NewNewRun(dp, *scrap->runs + runIndex + 1, styleIndex);
-
- runIndex++;
- runOffset = 0;
-
- }
-
- rp = *scrap->runs + runIndex;
-
- /* just set up the run -- don't worry about the text data */
-
- rp->numText = sizeof(short);
- SetHandleSize((Handle) rp->text, rp->numText);
-
- }
-
- replace->replaceIndex = replaceIndex;
- replace->runIndex = runIndex;
- replace->runOffset = runOffset;
-
- HUnlock((Handle) scrap->runs);
-
- return(true);
-
- }
-
- HUnlock((Handle) scrap->runs);
-
- return(false);
-
- }
-
- static Boolean FindStrInRun(ReplacementPtr replacements, Str255 str, NewRunPtr rp, short * runOffset)
- {
- short maxOffset;
- short strLen;
- char * strPtr, * textPtr;
- short i;
- StylePtr style;
-
- /* make sure the run is in the correct platform, script and encoding.
- WHY? Because we are looking for ASCII sctrings which don't make sense if these
- values are not set correctly */
-
- style = GetDocStyle(replacements->dp, rp->styleIndex);
-
- if(style->platform != gxMacintoshPlatform)
- return(false);
-
- /* lets look for it */
-
- strLen = str[0];
- maxOffset = rp->numText - strLen;
-
- strPtr = (char *) &str[1];
- textPtr = (char *) *rp->text;
-
- for(*runOffset = 0; *runOffset <= maxOffset; (*runOffset)++, textPtr++) {
-
- for(i=0; i<strLen; i++)
- if(strPtr[i] != textPtr[i])
- break;
-
- if(i == strLen)
- return(true);
-
- }
-
- return(false);
-
- }
-
- static void DoReplace(ReplacementPtr replacements, ReplacePtr replace)
- {
- NewRunPtr rp;
- char * charPtr;
- short * shortPtr;
-
- rp = *replacements->dp->scrap.runs + replace->runIndex;
-
- if(!replacements->proof->glyphIndicies) {
- charPtr = (char *) *rp->text + replace->runOffset;
- *charPtr = replacements->curChar[replace->replaceIndex];
- } else {
- shortPtr = (short *) ((char *) *rp->text + replace->runOffset);
- *shortPtr = replacements->curChar[replace->replaceIndex];
- }
- }
-
-